class Student:
    def __init__(self, name, age, gender):
        self.name = name
        self._age = age
        self.__gender = gender

    def fun1(self):
        print("没有下划线的方法:", end="\t")
        print(f"name={self.name},age={self._age},gender={self.__gender}")

    def _fun2(self):
        print("有一个下划线的方法:", end="\t")
        print(f"name={self.name},age={self._age},gender={self.__gender}")

    def __fun3(self):
        print("有两个下划线的方法", end="\t")
        print(f"name={self.name},age={self._age},gender={self.__gender}")


# 测试属性
stu = Student("yujikuan", 18, "男")
print(stu.name)
# 保护属性，可以访问只是不符合规范，解释器没有限制，所谓防君子不防小人
print(stu._age)
# AttributeError: 'Student' object has no attribute '__gender'
# 两个下划线是私有的属性所有无法访问
# print(stu.__gender)

# 测试方法
stu.fun1()
# 保护的方法，可以访问只是不符合规范，解释器没有限制，所谓防君子不防小人
stu._fun2()
# AttributeError: 'Student' object has no attribute '__fun3'. Did you mean: '_fun2'?
# 私有的方法无法访问
# stu.__fun3()

# 变通的访问,估计是为了特殊情况之下进行使用。
print(dir(stu))
print(stu._Student__gender)
stu._Student__fun3()
